use std::path::{PathBuf};
use rocket::fs::NamedFile;
use rocket::{get, catch};
use log::{info, warn, error, debug};

use crate::file_utils:: {get_safe_file_candidates};
use crate::page_cache::{get_cached_html};

#[get("/")]
pub async fn index() -> Option<NamedFile> {
    dynamic_serve(PathBuf::from("index")).await
}

#[get("/<file..>")] 
pub async fn dynamic_serve(file: PathBuf) -> Option<NamedFile> {
    info!("[文件请求] {:?}", file);
    get_file(file).await
}

async fn get_file(file: PathBuf) -> Option<NamedFile> {
    debug!("[文件请求] 请求文件路径: {:?}", file);

    let candidates = get_safe_file_candidates(&file);
    if candidates.is_empty() {
        debug!("[文件请求] 没有安全的候选路径可供尝试，原始路径: {:?}", file);
        return None;
    }
    
    for candidate in candidates {
        debug!("[文件请求] 尝试候选文件: {:?}", candidate);
        match NamedFile::open(&candidate).await {
            Ok(file) => {
                if let Some(ext) = file.path().extension().and_then(|s| s.to_str()) {
                    if ext == "md" {
                        debug!("[文件请求] 检测到 Markdown 文件，尝试获取缓存 HTML");

                        // 获取缓存的 HTML 路径
                        println!("{}", file.path().to_str()?);
                        if let Some(cached) = get_cached_html(file.path().to_str()?) {
                            debug!("[文件请求] 找到缓存 HTML: {:?}", cached.html_path);

                            // 尝试打开缓存的 HTML 文件
                            match NamedFile::open(&cached.html_path).await {
                                Ok(html_file) => {
                                    debug!("[文件请求] 成功提供缓存 HTML 文件");
                                    return Some(html_file);
                                }
                                Err(e) => {
                                    debug!(
                                        "[文件请求] 缓存 HTML 文件无法打开: {:?}, 错误: {:?}",
                                        cached.html_path, e
                                    );
                                    continue;
                                }
                            }
                        } else {

                            debug!("[文件请求] 无缓存 HTML，继续提供原始 .md 文件");
                        }
                    }
                    debug!("[文件请求] 成功提供文件: {:?}", candidate);
                    return Some(file);
                }
            }
            Err(_) => {
                debug!("[文件请求] 候选文件不存在: {:?}", candidate);
                continue;
            }
        }
    }
    debug!("[文件请求] 所有候选文件都不存在，原始路径: {:?}", file);
    None
}

#[catch(404)]
pub async fn not_found() -> Option<NamedFile> {
    warn!("[文件请求] 404 错误：页面未找到");
    NamedFile::open("static/404.html").await.ok()
}

#[catch(500)]
pub async fn internal_error() -> Option<NamedFile> {
    error!("[文件请求] 500 错误：服务器内部错误");
    NamedFile::open("static/500.html").await.ok()
}